// 这个文件是关于api请求抽离的js文件, 定义多个函数, 对应也给页面调用函数即可
// 封装请求的时候建议 req+请求方式+功能名
// axios 可以配置基地址(不要每次都写重复的基础路径), 只要设置了这句话, 发送请求的时候会默认拼接上基地址
// 全局修改axios配置
axios.defaults.baseURL = 'http://localhost:3000'
// 不管是请求拦截器还是响应拦截器,有两个函数, 函数一是正确响应执行的函数,函数2错误响应执行的函数
// 添加请求拦截器
axios.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    // 请求拦截器中的config是当前所发出的请求的信息对象, 在这个config对象中有headers可以自定义请求头
    console.log('经过了请求拦截器', config)
    // /my开头才需要加  /api开头不需要加 --- todo-------------
    // 字符串startsWith方法 检测字符串是否以某个字符开头 结果是一个布尔值
    if (config.url.startsWith('/my')) {
      config.headers.Authorization = sessionStorage.getItem('big-event-token')
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)
// 添加响应拦截器
axios.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么 响应拦截器中response就是当前这次请求响应的结果,response中的data就是要的message和status所在的对象
    console.log('响应拦截器执行了', response)
    const {
      data: { message, status }
    } = response
    if (status === 0) {
      layer.msg(message)
    }
    // 处理token过期
    // 如果因为别的情况导致响应状态码也是1,也会强制登录, 这个项目接口设计的问题, 以后项目中|开发中 关于token过期有一个单独的状态码 4开头  401 403
    if (status === 1) {
      layer.msg(message)
    }
    if (status === 401) {
      // 为了代码的严谨性 最好将过期的本地存储的token清除
      layer.msg(message)
      sessionStorage.removeItem('big-event-token')
      location.href = '/login.html'
    }
    return response // 将响应的数据交给客户端
  },
  function (error) {
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)
// 封装注册的api接口
const reqPostRegister = (obj) => {
  return axios({
    method: 'post',
    url: `/api/reguser`,
    // post请求携带参数使用data get请求携带参数params
    data: handleDataFormat(obj) // 直接调用工具函数处理数据得到处理数据的结果
  })
}
// 封装登录的接口
const reqPostLogin = (obj) => {
  return axios({
    method: 'post',
    url: `/api/login`,
    // post请求携带参数使用data get请求携带参数params
    data: handleDataFormat(obj)
  })
}
// 封装获取个人信息的接口
const reqGetUserInfo = () => {
  return axios({
    method: 'get',
    url: '/my/userinfo'
    // axios中headers节点允许自定义配置请求头信息
    // headers: {
    // 	// Authorization 后台接口中要求的字段 值是本地存储的token值
    // 	Authorization: localStorage.getItem('big-event-token'),
    // 	a:10,
    // 	b:20
    // }
  })
}

// 封装更新用户信息接口
const reqPostUpdateUserInfo = (obj) => {
  return axios({
    method: 'post',
    url: '/my/userinfo',
    data: handleDataFormat(obj)
  })
}

// 重置密码的接口
const reqPostRePwd = (obj) => {
  return axios({
    method: 'post',
    url: '/my/updatepwd',
    data: handleDataFormat(obj)
  })
}

// 更新头像的api
const reqPostUpdatePic = (obj) => {
  return axios({
    method: 'post',
    url: '/my/update/avatar',
    data: handleDataFormat(obj)
  })
}

// 获取文章分类列表
const reqGetCates = () => {
  return axios({
    method: 'get',
    url: '/my/article/cates'
  })
}

// 新增文章分类
const reqAddCate = (obj) => {
  return axios({
    method: 'post',
    url: '/my/article/addcates',
    data: obj
  })
}
// 删除文章分类
const reqDeletCate = (id) => {
  return axios({
    method: 'get',
    url: `/my/article/deletecate/${id}` // /my/article/deletecate/:id :id 占位
  })
}

// 编辑提交
const reqEditCate = (obj) => {
  return axios({
    method: 'post',
    url: '/my/article/updatecate',
    data: obj
  })
}

// 发布文章
const reqPostAddArticle = (data) => {
  return axios({
    method: 'post',
    url: '/my/article/add',
    data
  })
}

// 获取文章列表接口

const reqGetArticleList = (obj) => {
  return axios({
    method: 'get',
    url: '/my/article/list',
    // get 携带参数 params
    params: obj // 直接传递一个对象
  })
}

const reqGetArticleInfo = (id) => {
  return axios({
    method: 'get',
    url: `/my/article/${id}`
  })
}

const reqEditArticle = (data) => {
  return axios({
    method: 'post',
    url: '/my/article/edit',
    data
  })
}
// 封装通用的函数
// 1. 主要业务逻辑封装
// 2. 处理的数据 考虑到参数的问题
// 3. 处理的数据别人要用必须加返回值
